package lispinterpreter;

/**
 * 
 * @author JuanFer
 */
public class Main {

    /**
     * @param args the command line arguments
     * @throws ParametersException
     */
    public static void main(String[] args) throws ParametersException {

	String ins = "(+ 0 1 1 (- 10 5 3) (/ 10 5) 4)";
	// String ins = "(/ 10 5 2)";
	// LispParser parser = new LispParser();
	// LispList ls = parser.parseSimple(ins);

	// LispList ls = new LispList();
	//
	// LispList subList1 = new LispList();
	// LispList subList2 = new LispList();
	//
	// LispAtom atom0 = new LispAtom("+");
	// LispAtom atom1 = new LispAtom(0);
	// LispAtom atom2 = new LispAtom(1);
	// LispAtom atom3 = new LispAtom(1); // = 2
	//
	// LispAtom atom4 = new LispAtom("-");
	// LispAtom atom5 = new LispAtom(10);
	// LispAtom atom6 = new LispAtom(5);
	// LispAtom atom7 = new LispAtom(3); // = 2
	//
	// LispAtom atom8 = new LispAtom("/");
	// LispAtom atom9 = new LispAtom(10);
	// LispAtom atom10 = new LispAtom(5); // = 2
	//
	// LispAtom atom11 = new LispAtom(4); // = 4
	//
	// subList1.addElement(atom4);
	// subList1.addElement(atom5);
	// subList1.addElement(atom6);
	// subList1.addElement(atom7);
	// subList2.addElement(atom8);
	// subList2.addElement(atom9);
	// subList2.addElement(atom10);
	//
	// ls.addElement(atom0);
	// ls.addElement(atom1);
	// ls.addElement(atom2);
	// ls.addElement(atom3);
	// ls.addElement(subList1);
	// ls.addElement(subList2);
	// ls.addElement(atom11);
	//
	// while (!ls.isSimple()) {
	// for (int i = 0; i < ls.size(); i++) {
	// if (!ls.getElement(i).isAtom()) {
	// LispList evaluation = ElementaryFunctions.evaluate(ls
	// .getElement(i));
	// ls.replaceElement(i, evaluation);
	// }
	// }
	// }
	//
	// LispAtom result = (LispAtom) ElementaryFunctions.evaluate(ls);
	// System.out.println(">> " + ins);
	// result.printAtom();

	// Prueba la función setf a partir de una lista ingresada manualmente.
	BlackBox box = new BlackBox();
	box.evaluate(getSimulatedLispFromParser());
	box.evaluate(new LispAtom("foo"));
    }

    /**
     * Simula la lista LinkList que el parser debe generar.
     */
    private static LispList getSimulatedLispFromParser() {

	LispAtom lispCommand = new LispAtom("setf");
	LispAtom lispVariable = new LispAtom("foo");

	// Atomos con los operandos
	LispAtom atom1 = new LispAtom(3);
	LispAtom atom2 = new LispAtom(2);
	LispAtom atom3 = new LispAtom(5);
	LispList operands = new LispList();
	// Agrega los operandos a la lista LispList
	operands.addElement(atom1);
	operands.addElement(atom2);
	operands.addElement(atom3);

	// Lista que debería generar el parser
	LispList parserdIns = new LispList();
	parserdIns.addElement(lispCommand);
	parserdIns.addElement(lispVariable);
	parserdIns.addElement(operands);

	return parserdIns;
    }
}
